home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / oberonv4 / source / system / amigagraphics.mod (.txt) < prev    next >
Oberon Text  |  1996-06-15  |  16KB  |  564 lines

  1. Syntax10.Scn.Fnt
  2. Syntax12.Scn.Fnt
  3. Syntax10b.Scn.Fnt
  4. MODULE AmigaGraphics;    (* shml/cn/rd/oj *)
  5. IMPORT
  6.     SYSTEM, E:=AmigaExec;
  7. CONST
  8.     graphicsName*="graphics.library";        minversion = 36;
  9.     hiresLaceKey*=00008004H;
  10. (* drawing modes as Flags, not Bitposition *)
  11.     jam1*=0;
  12.     jam2*=1;
  13.     complement*=2;
  14.     inversvid*=4;
  15. (* Layer Flags *)
  16.     layerSimple*=0;
  17.     layerBackdrop*=6;
  18. (* AllocBitMap Flags *)
  19.     bmbClear*= 0;
  20.     bmbDisplayable*= 1;
  21.     bmbInterleaved*= 2;
  22.     bmbStandard*= 3;
  23.     bmbMinplanes*= 4;
  24. (* ObtainPen Flags, V39 *)
  25.     penbExclusive*= 0;
  26.     penbNoSetcolor*= 1;
  27.  Some Pointer without their records
  28.     AreaInfoPtr*=LONGINT;
  29.     ClipRectPtr*=LONGINT;
  30.     ColorMapPtr*=LONGINT;
  31.     CopListPtr*=LONGINT;
  32.     GelsInfoPtr*=LONGINT;
  33.     HookPtr*=LONGINT;
  34.     LayerPtr*=LONGINT;
  35.     LayerInfoPtr*=LONGINT;
  36.     PlanePtr*=LONGINT;
  37.     RasInfoPtr*=LONGINT;
  38.     RastPortPtr*=LONGINT;
  39.     RegionPtr*=LONGINT;
  40.     RectanglePtr*=LONGINT;
  41.     TmpRasPtr*=LONGINT;
  42.     UCopListPtr*=LONGINT;
  43.     LayerInfo*=RECORD
  44.         layer*:LayerPtr;
  45.         lp*:LayerPtr;         (* system use *)
  46.         obs*:ClipRectPtr;
  47.         freeClipRects*:E.MinList;
  48.         lock*:E.SignalSemaphore;
  49.         head*:E.List;
  50.         longreserved*:LONGINT;
  51.         flags*:INTEGER;
  52.         count*:SHORTINT;
  53.         lockLayersCount*:SHORTINT;
  54.         layerInfoExtraSize*:INTEGER;
  55.         blitbuff*:LONGINT;
  56.         layerInfoExtra*:E.PROC
  57.     END;
  58.     ViewPortPtr*=LONGINT;
  59.     ViewPort*=RECORD
  60.         next*:ViewPortPtr;
  61.         colorMap*:ColorMapPtr;
  62.         dspIns*:CopListPtr;
  63.         sprIns*:CopListPtr;
  64.         clrIns*:CopListPtr;
  65.         uCopIns*:UCopListPtr;
  66.         dWidth*,dHeight*:INTEGER;
  67.         dxOffset*,dyOffset*:INTEGER;
  68.         modes*:INTEGER;
  69.         spritePriorities*:SHORTINT;
  70.         extendedModes*:SHORTINT;
  71.         rasInfo*:RasInfoPtr
  72.     END;
  73.     TextAttr*=RECORD
  74.         name*:LONGINT;
  75.         ySize*:INTEGER;
  76.         style*:SHORTINT;
  77.         flags*:SHORTINT
  78.     END;
  79.     TextAttrPtr*=LONGINT;
  80.     TextFont*=RECORD
  81.         message*:E.Message;
  82.         ySize*:INTEGER;
  83.         style*:SHORTINT;
  84.         flags*:SHORTINT;
  85.         xSize*:INTEGER;
  86.         baseline*:INTEGER;
  87.         boldSmear*:INTEGER;
  88.         accessors*:INTEGER;
  89.         loChar*:CHAR;
  90.         hiChar*:CHAR;
  91.         charData*:LONGINT;
  92.         modulo*:INTEGER;
  93.         charLoc*:LONGINT;
  94.         charSpace*:LONGINT;
  95.         charKern*:LONGINT
  96.     END;
  97.     TextFontPtr*=LONGINT;
  98.     BitMap*=RECORD
  99.         bytesPerRow*:INTEGER;
  100.         rows*:INTEGER;
  101.         flags*:SHORTINT;
  102.         depth*:SHORTINT;
  103.         pad*:INTEGER;
  104.         planes*:ARRAY 8 OF PlanePtr
  105.     END;
  106.     BitMapPtr*=LONGINT;
  107.     BitMapPointer*=POINTER TO BitMap;
  108.     Rectangle*=RECORD
  109.         minX*,minY*,maxX*,maxY*:INTEGER
  110.     END;
  111.     LayerPointer*=POINTER TO Layer;
  112.     Layer*=RECORD
  113.         front*:LayerPtr;
  114.         back*:LayerPtr;
  115.         clipRect*:ClipRectPtr;
  116.         rp*:RastPortPtr;
  117.         bounds*:Rectangle;
  118.         reserved:ARRAY 4 OF SYSTEM.BYTE;
  119.         priority*:INTEGER;
  120.         flags*:INTEGER;
  121.         superBitMap*:BitMapPtr;
  122.         superClipRect*:ClipRectPtr;
  123.         window*:LONGINT;
  124.         scrollX*:INTEGER;
  125.         scrollY*:INTEGER;
  126.         cr*:ClipRectPtr;
  127.         cr2*:ClipRectPtr;
  128.         crnew*:ClipRectPtr;
  129.         superSaveClipRects*:ClipRectPtr;
  130.         cliprects*:ClipRectPtr;
  131.         layerInfo*:LayerInfoPtr;
  132.         lock*:E.SignalSemaphore;
  133.         backFill*:HookPtr;
  134.         reserved1:LONGINT;
  135.         clipRegion*:RegionPtr;
  136.         saveClipRects*:RegionPtr;
  137.         width*,height*:INTEGER;
  138.         reserved2:ARRAY 18 OF SYSTEM.BYTE;
  139.         damageList*:RegionPtr
  140.     END;
  141.     RastPortPointer*=POINTER TO RastPort;
  142.     RastPort*=RECORD
  143.         layer*:LayerPtr;
  144.         bitMap*:BitMapPtr;
  145.         areaPtrn*:LONGINT;
  146.         tmpRas*:TmpRasPtr;
  147.         areaInfo*:AreaInfoPtr;
  148.         gelsInfo*:GelsInfoPtr;
  149.         mask*:SHORTINT;
  150.         fgPen*:SHORTINT;
  151.         bgPen*:SHORTINT;
  152.         aOlPen*:SHORTINT;
  153.         drawMode*:SHORTINT;
  154.         areaPtSz*:SHORTINT;
  155.         linPatCnt*:SHORTINT;
  156.         dummy*:SHORTINT;
  157.         flags*:INTEGER;
  158.         linePtrn*:INTEGER;
  159.         x*,y*:INTEGER;
  160.         minterms*:ARRAY 8 OF SHORTINT;
  161.         penWidth*:INTEGER;
  162.         penHeight*:INTEGER;
  163.         font*:TextFontPtr;
  164.         algoStyle*:SHORTINT;
  165.         txFlags*:SHORTINT;
  166.         txHeigh*:INTEGER;
  167.         txWidth*:INTEGER;
  168.         txBaselin*:INTEGER;
  169.         txSpacing*:INTEGER;
  170.         user*:LONGINT;
  171.         longreserved*:ARRAY 2 OF LONGINT;
  172.         wordreserved*:ARRAY 7 OF INTEGER;
  173.         reserved*:ARRAY 8 OF SHORTINT
  174.     END;
  175.     gfxBase-: E.LibraryPtr;
  176.     gfxVersion-: INTEGER;
  177.     termEntry: E.TermEntry;
  178.     dummy: LONGINT;
  179.     GetRGB32*: PROCEDURE(colorMap:ColorMapPtr; firstcolor,ncolors:LONGINT; VAR table:ARRAY OF SYSTEM.BYTE);
  180.     SetRGB32*: PROCEDURE(vp:ViewPortPtr; index,red,green,blue:LONGINT);
  181.     SetWriteMask*: PROCEDURE(rp:RastPortPtr; Mask:LONGINT);
  182.     FreeBitMap*: PROCEDURE(bm: BitMapPtr);
  183.     AllocBitMap*: PROCEDURE(x, y, depth: LONGINT; flags: SET; friendBitMap: BitMapPtr):BitMapPtr;
  184.     ObtainPen*: PROCEDURE(cm: ColorMapPtr; n, r, g, b: LONGINT; Flags: SET): LONGINT;
  185.     ReleasePen*: PROCEDURE(cm: ColorMapPtr; n: LONGINT);
  186. PROCEDURE -ReturnD0    04EH,05EH,  04EH,075H;
  187. PROCEDURE AddFont*(textFontPtr:TextFontPtr);
  188. BEGIN
  189.     SYSTEM.PUTREG( 9, textFontPtr );
  190.     SYSTEM.CALL( -480, gfxBase )
  191. END AddFont;
  192. PROCEDURE AllocRaster*(width,height:INTEGER):PlanePtr;
  193. BEGIN
  194.     SYSTEM.PUTREG( 0, width );
  195.     SYSTEM.PUTREG( 1, height );
  196.     SYSTEM.CALL( -492, gfxBase );
  197.     ReturnD0
  198. END AllocRaster;
  199. PROCEDURE BltBitMapRastPort*(
  200.            srcBitMap:BitMapPtr;
  201.            xSrc,ySrc:INTEGER;
  202.            destRP:RastPortPtr;
  203.            xDest,yDest:INTEGER;
  204.            xSize,ySize:INTEGER;
  205.            minterm:CHAR);
  206. BEGIN
  207.     SYSTEM.PUTREG( 8, srcBitMap );
  208.     SYSTEM.PUTREG( 0, xSrc );
  209.     SYSTEM.PUTREG( 1, ySrc );
  210.     SYSTEM.PUTREG( 9, destRP );
  211.     SYSTEM.PUTREG( 2, xDest );
  212.     SYSTEM.PUTREG( 3, yDest );
  213.     SYSTEM.PUTREG( 4, xSize );
  214.     SYSTEM.PUTREG( 5, ySize );
  215.     SYSTEM.PUTREG( 6, minterm );
  216.     SYSTEM.CALL( -606, gfxBase )
  217. END BltBitMapRastPort;
  218. PROCEDURE BltPattern*(
  219.            rp:RastPortPtr;
  220.            mask:LONGINT;
  221.            xl,yl:INTEGER;
  222.            maxX,maxY:INTEGER;
  223.            byteCnt:INTEGER);
  224. BEGIN
  225.     SYSTEM.PUTREG( 8, mask );
  226.     SYSTEM.PUTREG( 9, rp );
  227.     SYSTEM.PUTREG( 0, xl );
  228.     SYSTEM.PUTREG( 1, yl );
  229.     SYSTEM.PUTREG( 2, maxX );
  230.     SYSTEM.PUTREG( 3, maxY );
  231.     SYSTEM.PUTREG( 4, byteCnt );
  232.     SYSTEM.CALL( -312, gfxBase )
  233. END BltPattern;
  234. PROCEDURE BltTemplate*(
  235.            srcTemplate:LONGINT;
  236.            srcX,srcMod:INTEGER;
  237.            rp:RastPortPtr;
  238.            dstX,dstY:INTEGER;
  239.            sizeX,sizeY:INTEGER);
  240. BEGIN
  241.     SYSTEM.PUTREG( 8, srcTemplate );
  242.     SYSTEM.PUTREG( 0, srcX );
  243.     SYSTEM.PUTREG( 1, srcMod );
  244.     SYSTEM.PUTREG( 9, rp );
  245.     SYSTEM.PUTREG( 2, dstX );
  246.     SYSTEM.PUTREG( 3, dstY );
  247.     SYSTEM.PUTREG( 4, sizeX );
  248.     SYSTEM.PUTREG( 5, sizeY );
  249.     SYSTEM.CALL( -36, gfxBase )
  250. END BltTemplate;
  251. PROCEDURE ClearRegion*(region:RegionPtr);
  252. BEGIN
  253.     SYSTEM.PUTREG( 8, region );
  254.     SYSTEM.CALL( -528, gfxBase )
  255. END ClearRegion;
  256. PROCEDURE ClipBlit*(
  257.            srcRP:RastPortPtr;
  258.            xSrc,ySrc:INTEGER;
  259.            destRP:RastPortPtr;
  260.            xDest,yDest:INTEGER;
  261.            xSize,ySize:INTEGER;
  262.            minterm:CHAR);
  263. BEGIN
  264.     SYSTEM.PUTREG( 8, srcRP );
  265.     SYSTEM.PUTREG( 0, xSrc );
  266.     SYSTEM.PUTREG( 1, ySrc );
  267.     SYSTEM.PUTREG( 9, destRP );
  268.     SYSTEM.PUTREG( 2, xDest );
  269.     SYSTEM.PUTREG( 3, yDest );
  270.     SYSTEM.PUTREG( 4, xSize );
  271.     SYSTEM.PUTREG( 5, ySize );
  272.     SYSTEM.PUTREG( 6, minterm );
  273.     SYSTEM.CALL( -552, gfxBase )
  274. END ClipBlit;
  275. PROCEDURE CloseFont*(font:TextFontPtr);
  276. BEGIN
  277.     SYSTEM.PUTREG( 9, font );
  278.     SYSTEM.CALL( -78, gfxBase )
  279. END CloseFont;
  280. PROCEDURE DisposeRegion*(region:RegionPtr);
  281. BEGIN
  282.     SYSTEM.PUTREG( 8, region );
  283.     SYSTEM.CALL( -534, gfxBase )
  284. END DisposeRegion;
  285. PROCEDURE Draw*(rp:RastPortPtr; x,y:INTEGER);
  286. BEGIN
  287.     SYSTEM.PUTREG( 9, rp );
  288.     SYSTEM.PUTREG( 0, x );
  289.     SYSTEM.PUTREG( 1, y );
  290.     SYSTEM.CALL( -246, gfxBase )
  291. END Draw;
  292. PROCEDURE DrawEllipse*(rp:RastPortPtr; x,y,a,b:INTEGER);
  293. BEGIN
  294.     SYSTEM.PUTREG( 9, rp );
  295.     SYSTEM.PUTREG( 0, x );
  296.     SYSTEM.PUTREG( 1, y );
  297.     SYSTEM.PUTREG( 2, a );
  298.     SYSTEM.PUTREG( 3, b );
  299.     SYSTEM.CALL( -180, gfxBase )
  300. END DrawEllipse;
  301. PROCEDURE FreeRaster*(p:PlanePtr; width,height:INTEGER);
  302. BEGIN
  303.     SYSTEM.PUTREG( 8, p );
  304.     SYSTEM.PUTREG( 0, width );
  305.     SYSTEM.PUTREG( 1, height );
  306.     SYSTEM.CALL( -498, gfxBase )
  307. END FreeRaster;
  308. PROCEDURE GetRGB4(colorMap:ColorMapPtr; entry:LONGINT):LONGINT;
  309. BEGIN
  310.     SYSTEM.PUTREG( 8, colorMap );
  311.     SYSTEM.PUTREG( 0, entry );
  312.     SYSTEM.CALL( -582, gfxBase );
  313.     ReturnD0
  314. END GetRGB4;
  315. PROCEDURE GetVPModeID*(vp:ViewPortPtr):LONGINT;
  316. BEGIN
  317.     SYSTEM.PUTREG( 8, vp );
  318.     SYSTEM.CALL( -792, gfxBase );
  319.     ReturnD0
  320. END GetVPModeID;
  321. PROCEDURE InitBitMap*(bm:BitMapPtr; depth:SHORTINT; width,height:INTEGER);
  322. BEGIN
  323.     SYSTEM.PUTREG( 8, bm );
  324.     SYSTEM.PUTREG( 0, depth );
  325.     SYSTEM.PUTREG( 1, width );
  326.     SYSTEM.PUTREG( 2, height );
  327.     SYSTEM.CALL( -390, gfxBase )
  328. END InitBitMap;
  329. PROCEDURE InitRastPort*(VAR rp:RastPort);
  330. BEGIN
  331.     SYSTEM.PUTREG( 9, SYSTEM.ADR(rp) );
  332.     SYSTEM.CALL( -198, gfxBase )
  333. END InitRastPort;
  334. PROCEDURE Move*(rp:RastPortPtr; x,y:INTEGER);
  335. BEGIN
  336.     SYSTEM.PUTREG( 9, rp );
  337.     SYSTEM.PUTREG( 0, x );
  338.     SYSTEM.PUTREG( 1, y );
  339.     SYSTEM.CALL( -240, gfxBase )
  340. END Move;
  341. PROCEDURE NewRegion*():RegionPtr;
  342. BEGIN
  343.     SYSTEM.CALL( -516, gfxBase );
  344.     ReturnD0
  345. END NewRegion;
  346. PROCEDURE OrRectRegion*(region:RegionPtr; rectangle:RectanglePtr):BOOLEAN;
  347. BEGIN
  348.     SYSTEM.PUTREG( 8, region );
  349.     SYSTEM.PUTREG( 9, rectangle );
  350.     SYSTEM.CALL( -510, gfxBase );
  351.     SYSTEM.GETREG( 0, dummy );
  352.     RETURN dummy#E.false
  353. END OrRectRegion;
  354. PROCEDURE ReadPixel*(rp:RastPortPtr; x,y:INTEGER):INTEGER;
  355. BEGIN
  356.     SYSTEM.PUTREG( 9, rp );
  357.     SYSTEM.PUTREG( 0, x );
  358.     SYSTEM.PUTREG( 1, y );
  359.     SYSTEM.CALL( -318, gfxBase );
  360.     ReturnD0
  361. END ReadPixel;
  362. PROCEDURE RectFill*(rp:RastPortPtr; xMin,yMin,xMax,yMax:INTEGER);
  363. BEGIN
  364.     SYSTEM.PUTREG( 9, rp );
  365.     SYSTEM.PUTREG( 0, xMin );
  366.     SYSTEM.PUTREG( 1, yMin );
  367.     SYSTEM.PUTREG( 2, xMax );
  368.     SYSTEM.PUTREG( 3, yMax );
  369.     SYSTEM.CALL( -306, gfxBase )
  370. END RectFill;
  371. PROCEDURE SetAPen*(rp:RastPortPtr; pen:INTEGER);
  372. BEGIN
  373.     SYSTEM.PUTREG( 9, rp );
  374.     SYSTEM.PUTREG( 0, pen );
  375.     SYSTEM.CALL( -342, gfxBase )
  376. END SetAPen;
  377. PROCEDURE SetBPen*(rp:RastPortPtr; pen:INTEGER);
  378. BEGIN
  379.     SYSTEM.PUTREG( 9, rp );
  380.     SYSTEM.PUTREG( 0, pen );
  381.     SYSTEM.CALL( -348, gfxBase )
  382. END SetBPen;
  383. PROCEDURE SetDrMd*(rp:RastPortPtr; drawMode:SHORTINT);
  384. BEGIN
  385.     SYSTEM.PUTREG( 9, rp );
  386.     SYSTEM.PUTREG( 0, drawMode );
  387.     SYSTEM.CALL( -354, gfxBase )
  388. END SetDrMd;
  389. PROCEDURE SetFont*(rp:RastPortPtr; textFont:TextFontPtr);
  390. BEGIN
  391.     SYSTEM.PUTREG( 9, rp );
  392.     SYSTEM.PUTREG( 8, textFont );
  393.     SYSTEM.CALL( -66, gfxBase )
  394. END SetFont;
  395. PROCEDURE SetRGB4(vp:ViewPortPtr; index,red,green,blue:INTEGER);
  396. BEGIN
  397.     SYSTEM.PUTREG( 8, vp );
  398.     SYSTEM.PUTREG( 0, index );
  399.     SYSTEM.PUTREG( 1, red );
  400.     SYSTEM.PUTREG( 2, green );
  401.     SYSTEM.PUTREG( 3, blue );
  402.     SYSTEM.CALL( -288, gfxBase )
  403. END SetRGB4;
  404. PROCEDURE Text*(rp:RastPortPtr; string:ARRAY OF CHAR; count:LONGINT);
  405. BEGIN
  406.     SYSTEM.PUTREG( 8, SYSTEM.ADR(string) );
  407.     SYSTEM.PUTREG( 9, rp );
  408.     SYSTEM.PUTREG( 0, count );
  409.     SYSTEM.CALL( -60, gfxBase )
  410. END Text;
  411. PROCEDURE WaitBlit*();
  412. BEGIN
  413.     SYSTEM.CALL( -228, gfxBase )
  414. END WaitBlit;
  415. PROCEDURE WritePixel*(rp:RastPortPtr; x,y:INTEGER);
  416. BEGIN
  417.     SYSTEM.PUTREG( 9, rp );
  418.     SYSTEM.PUTREG( 0, x );
  419.     SYSTEM.PUTREG( 1, y );
  420.     SYSTEM.CALL( -324, gfxBase );
  421.     (* Result is ignored *)
  422. END WritePixel;
  423. PROCEDURE OS2GetRGB32(colorMap:ColorMapPtr; firstcolor,ncolors:LONGINT; VAR table:ARRAY OF SYSTEM.BYTE);
  424.     CONST conv4 = 011111111H;
  425.     TYPE Entry = POINTER TO RECORD r,g,b : LONGINT  END;
  426.     VAR entry : Entry;  col : LONGINT;  i : INTEGER;
  427. BEGIN
  428.     i := SHORT(ncolors);
  429.     WHILE i > 0 DO  DEC(i);
  430.         col := GetRGB4(colorMap, firstcolor+i);
  431.         IF col # -1 THEN
  432.             entry := SYSTEM.VAL( Entry, SYSTEM.ADR(table[i*12]) );
  433.             entry.r  := ( (col DIV 100H) MOD 16 ) * conv4;
  434.             entry.g := ( (col DIV   10H) MOD 16 ) * conv4;        (* overflow possible! *)
  435.             entry.b := (  col                   MOD 16 ) * conv4
  436.         END
  437. END OS2GetRGB32;
  438. PROCEDURE OS3GetRGB32(colorMap:ColorMapPtr; firstcolor,ncolors:LONGINT; VAR table:ARRAY OF SYSTEM.BYTE);
  439. BEGIN
  440.     SYSTEM.PUTREG( 9, SYSTEM.ADR(table) );
  441.     SYSTEM.PUTREG( 8, colorMap );
  442.     SYSTEM.PUTREG( 0, firstcolor );
  443.     SYSTEM.PUTREG( 1, ncolors );
  444.     SYSTEM.CALL( -900, gfxBase )
  445. END OS3GetRGB32;
  446. PROCEDURE OS2SetRGB32(vp:ViewPortPtr; index,red,green,blue:LONGINT);
  447. BEGIN
  448.     SetRGB4(vp,SHORT(index),
  449.         SHORT( SYSTEM.LSH(red,-28)),
  450.         SHORT( SYSTEM.LSH(green,-28)),
  451.         SHORT( SYSTEM.LSH(blue,-28))
  452. END OS2SetRGB32;
  453. PROCEDURE OS3SetRGB32(vp:ViewPortPtr; index,red,green,blue:LONGINT);
  454. BEGIN
  455.     SYSTEM.PUTREG( 8, vp );
  456.     SYSTEM.PUTREG( 0, index );
  457.     SYSTEM.PUTREG( 1, red );
  458.     SYSTEM.PUTREG( 2, green );
  459.     SYSTEM.PUTREG( 3, blue );
  460.     SYSTEM.CALL( -852, gfxBase )
  461. END OS3SetRGB32;
  462. PROCEDURE OS2SetWriteMask(rp:RastPortPtr; Mask:LONGINT);
  463.     VAR rastport : RastPortPointer;
  464. BEGIN
  465.     rastport:=SYSTEM.VAL(RastPortPointer,rp);
  466.     rastport.mask := SHORT(SHORT(Mask))
  467. END OS2SetWriteMask;
  468. PROCEDURE OS3SetWriteMask(rp:RastPortPtr; Mask:LONGINT);
  469. BEGIN
  470.     SYSTEM.PUTREG( 8, rp );
  471.     SYSTEM.PUTREG( 0, Mask );
  472.     SYSTEM.CALL( -984, gfxBase );
  473.     (* Result is ignored *)
  474. END OS3SetWriteMask;
  475. PROCEDURE OS2FreeBitMap(bm: BitMapPtr);
  476.     VAR i : SHORTINT;  bmptr : BitMapPointer;
  477. BEGIN
  478.     bmptr := SYSTEM.VAL( BitMapPointer, bm );  i := 0;
  479.     WHILE (i<bmptr.depth) & (bmptr.planes[i]#0) DO
  480.         FreeRaster( bmptr.planes[i], bmptr.bytesPerRow*8, bmptr.rows );
  481.         bmptr.planes[i] := 0;  INC(i)
  482.     END;
  483.     E.FreeMem( bm, SIZE( BitMap) )
  484. END OS2FreeBitMap;
  485. PROCEDURE OS3FreeBitMap(bm: BitMapPtr);
  486. BEGIN
  487.     SYSTEM.PUTREG( 8, bm );
  488.     SYSTEM.CALL( -924, gfxBase )
  489. END OS3FreeBitMap;
  490. PROCEDURE OS2AllocBitMap(x, y, depth: LONGINT; flags: SET; friendBitMap: BitMapPtr):BitMapPtr;
  491.     VAR bm : BitMapPtr;  bmptr : BitMapPointer;  w,h : INTEGER;  d,i : SHORTINT;
  492. BEGIN
  493.     bm := SYSTEM.VAL( BitMapPtr, E.AllocMem( SIZE(BitMap), {} ) );
  494.     bmptr := SYSTEM.VAL( BitMapPointer, bm );
  495.     w := SHORT(x);  h := SHORT(y);  d := SHORT(SHORT(depth));
  496.     InitBitMap( bm, d, w, h );  i := -1;
  497.     REPEAT  INC(i);
  498.         bmptr.planes[i] := AllocRaster( bmptr.bytesPerRow*8, bmptr.rows )
  499.     UNTIL (i=d) OR (bmptr.planes[i]=0);
  500.     IF bmptr.planes[i]=0 THEN  FreeBitMap( bm );  RETURN 0  ELSE  RETURN bm  END
  501. END OS2AllocBitMap;
  502. PROCEDURE OS3AllocBitMap(x, y, depth: LONGINT; flags: SET; friendBitMap: BitMapPtr):BitMapPtr;
  503. BEGIN
  504.     SYSTEM.PUTREG( 0, x );
  505.     SYSTEM.PUTREG( 1, y );
  506.     SYSTEM.PUTREG( 2, depth );
  507.     SYSTEM.PUTREG( 3, flags );
  508.     SYSTEM.PUTREG( 8, friendBitMap );
  509.     SYSTEM.CALL( -918, gfxBase );
  510.     ReturnD0
  511. END OS3AllocBitMap;
  512. (* only available in OS3 *)
  513. PROCEDURE OS3ObtainPen(cm: ColorMapPtr; n, r, g, b: LONGINT; Flags: SET): LONGINT;
  514. BEGIN
  515.     SYSTEM.PUTREG( 8, cm );
  516.     SYSTEM.PUTREG( 0, n );
  517.     SYSTEM.PUTREG( 1, r );
  518.     SYSTEM.PUTREG( 2, g );
  519.     SYSTEM.PUTREG( 3, b );
  520.     SYSTEM.PUTREG( 4, SYSTEM.VAL(LONGINT, Flags));
  521.     SYSTEM.CALL( -954, gfxBase );
  522.     ReturnD0
  523. END OS3ObtainPen;
  524. (* only available in OS3 *)
  525. PROCEDURE OS3ReleasePen(cm: ColorMapPtr; n: LONGINT);
  526. BEGIN
  527.     SYSTEM.PUTREG( 8, cm );
  528.     SYSTEM.PUTREG( 0, n );
  529.     SYSTEM.CALL( -948, gfxBase )
  530. END OS3ReleasePen;
  531. PROCEDURE Init;
  532. TYPE LibraryPtr = POINTER TO E.Library;
  533. VAR lib : LibraryPtr;
  534. BEGIN
  535.     gfxBase:=E.OpenLibrary(graphicsName,minversion);
  536.     IF gfxBase=0 THEN HALT(99) END;
  537.     lib:=SYSTEM.VAL(LibraryPtr,gfxBase);
  538.     gfxVersion:=lib.version;
  539.     IF gfxVersion>=39 THEN
  540.         GetRGB32:=OS3GetRGB32;
  541.         SetRGB32:=OS3SetRGB32;
  542.         SetWriteMask:=OS3SetWriteMask;
  543.         FreeBitMap:=OS3FreeBitMap;
  544.         AllocBitMap:=OS3AllocBitMap;
  545.         ObtainPen:=OS3ObtainPen;
  546.         ReleasePen:=OS3ReleasePen
  547.     ELSE
  548.         GetRGB32:=OS2GetRGB32;
  549.         SetRGB32:=OS2SetRGB32;
  550.         SetWriteMask:=OS2SetWriteMask;
  551.         FreeBitMap:=OS2FreeBitMap;
  552.         AllocBitMap:=OS2AllocBitMap;
  553.         ObtainPen:=NIL;
  554.         ReleasePen:=NIL
  555. END Init;
  556. PROCEDURE Term;
  557. BEGIN
  558.     E.CloseLibrary( gfxBase )
  559. END Term;
  560. BEGIN
  561.     Init;
  562.     E.Register(termEntry, Term)
  563. END AmigaGraphics.
  564.